package com.kuang.volatileTest;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author luomingliang
 * @date 2021/5/26 21:51
 */
public class VDemo2 {

    //volatile不保证原子性
//    private static volatile int num = 0;
    //原子类的 Integer
    private static volatile AtomicInteger num = new AtomicInteger();

    public static void add() {
//        num++; //不是原子性操作
        num.getAndIncrement(); //AtomicInteger的 +1 方法， 利用底层的CAS
    }

    public static void main(String[] args) {
        //理论上最终num为20000
        for (int i=1; i<=20; i++) {
            new Thread(()->{
                for (int j=0; j<1000; j++) {
                    add();
                }
            }).start();
        }
        while (Thread.activeCount()>2) { //main gc
            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName()+" "+num);

        int x = 1; //1
        int y = 2; //2
        x = x + 5; //3
        y = x + x; //4

        //我们所期望的执行步骤:1234 但是可能执行的时候变成 2134 1324
        //可不可能是 4123. 不可能

    }
}
